package com.woniuxy.project.send.config.dlq;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DeadLetterConfig {
    /*
        普通队列
            普通队列：normal.queue
            普通交换机：normal.exchange
            队列绑定到交换机路由键：city.gz
     */

    //创建队列
    @Bean
    public Queue normalQueue() {
        // 目标：让这个队列 normal.queue 中别拒绝的消息自动投递到死信队列 dlx.queue
        // 绑定  死信交换机   dlx.exchange
        // 绑定  死信路由key  dlx.routing.key
        // 设置  消息过期时间（测试过期入队，需要把原来的队列删掉重建）
        // 设置  队列存放最大消息数（测试超量入队，同上）
        return QueueBuilder
                .durable("normal.queue")
                .deadLetterExchange("dlx.exchange")
                .deadLetterRoutingKey("dlx.routing.key")
                .ttl(15000) // 队列中消息15秒没有被消费，进入死信队列
                // 运用场景：延迟队列，如45分钟未支付，取消订单
                .maxLength(20) // 队列中消息数量超过20，进入死信队列
                .build();
//        return new Queue("normal.queue");
    }

    //创建交换机
    @Bean
    public DirectExchange normalExchange() {
        return new DirectExchange("normal.exchange");
    }

    //队列绑定到交换机
    @Bean
    public Binding normalToDirectExchange(Queue normalQueue, DirectExchange normalExchange) {
        return BindingBuilder.bind(normalQueue).to(normalExchange).with("city.gz");
    }

    /*
        死信队列
            死信队列：dlx.queue
            死信交换机：dlx.exchange
            队列绑定到交换机路由键：dlx.routing.key
     */

    //创建队列
    @Bean
    public Queue dlxQueue() {
        return new Queue("dlx.queue");
    }

    //创建交换机
    @Bean
    public DirectExchange dlxExchange() {
        return new DirectExchange("dlx.exchange");
    }

    //队列绑定到交换机
    @Bean
    public Binding dlxToDirectExchange(Queue dlxQueue, DirectExchange dlxExchange) {
        return BindingBuilder.bind(dlxQueue).to(dlxExchange).with("dlx.routing.key");
    }

}
